package grade.calculate.listener;

import grade.calculate.event.Event;
import grade.calculate.pojo.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 事件监听器
 * <p>实现了{@link Listener}接口 读取方法执行完后 按照添加事件的顺序 运行事件的run方法</p>
 *
 * @author fromdrowning
 * @date 2024/2/20 19:45
 */
public class ReadListener implements Listener {

    /**
     * 将会被触发的事件集合
     */
    private final List<Event> eventList;

    /**
     * 初始化资源
     */
    public ReadListener() {
        this.eventList = new ArrayList<>();
    }

    /**
     * 添加事件
     *
     * @param event 读取方法执行完后需要执行的事件
     */
    @Override
    public void addEventAfterRead(Event event) {
        // 添加前判断事件是否为null 为null抛异常
        Optional.ofNullable(event).ifPresentOrElse(eventList::add, () -> {
            throw new RuntimeException("添加的事件不能为空");
        });
    }

    /**
     * 通知所有事件
     * <p>读取方法执行完后 此方法会被调用 按照添加事件的顺序 运行事件的run方法</p>
     *
     * @param data {@link Data}中可以获取到启动时配置的参数和其它事件处理结果数据
     */
    @Override
    public void notifyAllEvent(Data data) {
        eventList.forEach(event -> event.run(data));
    }
}
